\section{Implementazione Compilatore}

Il compilatore è stato costruito con l'ausilio di JavaCC\cite{javacc_website:11}\cite{javacc_faq:13}\cite{javacc_lexer:14}. Essendo il linguaggio
costituito da due tipi di file è stato necessario capire come poter effettuare
il parsing. La soluzione è stata quella di caricare (al momento della direttiva
di import) il file al volo e iniziare il parsing del file sospendendo
quello principale per poi riprenderlo successivamente; si è fatto in modo di
separare fortemente le due sezioni in modo da poter implementare una
funzionalità di solo checking (utile per il plugin eclipse).


Un aspetto interessante della compilatore è quello di poter definire espressioni
regolari che funzionano in un particolare stato\footnote{Nella teminologia
JavaCC, STATE}\cite{javacc_state:12}; con questa soluzione è
possibile utilizzare un meccanismo basato su contesti in cui viene attivato il
riconoscimento di determinate espressioni regolari solo se è avvenuto il
riconoscimento di un'altra particolare espressione. In questo modo è molto più
semplice definire con precisione ciò che ci si aspetta di riconoscere
successivamente. Un esempio compatto è quello dei riconscimento del file di
input: 


\begin{lstlisting}[ style={none}]
TOKEN:{
	<IMPORT: "import"> : IMPORT_STATE
}
<IMPORT_STATE>  TOKEN : { <FILE_NAME: (~[";"])* > : DEFAULT  }
\end{lstlisting}

Con questo spezzone di codice si dice che una volta incontrata la parola chiave
``import'' si entra in uno stato denominato ``IMPORT\_STATE''; tutto quello che
c'è dopo, fino al ``;'', è da considerarsi come il token FILE\_NAME. Con questo
metodo non si devono definire strane meccanismi per fare in modo che un elemento non
venga riconosciuto come un altro (per il problema della sovrapposizione delle
espressioni regolari) ma basta indicare l'espressione che meglio si adatta
perchè solo quella verrà cercata in quella posizione.

\subsection{Utilizzo del compilatore da linea di comando}

Per illustrare l'utilizzo del compilatore analizziamo il listato del comando:

\begin{lstlisting}[ style={none}]
java -jar cUml2Svg.jar --help
\end{lstlisting}

oppure eseguiamo la classe ``org.cuml2svg.compiler.Compiler''; il risultato sarà:

\begin{lstlisting}[caption={Output dell'help da linea di comando}, style={none}]
cUml2Svg - generation of svg diagram
        from a coded rappresentation

  Usage: u2sc [option]
 
 --help         print this message
 
 --disable-warning, -dw disable warning messages
 --disable-error, -de   disable error messages
 --disable-notice, -dn  disable notice mesages
 
 --check, -c            only check syntax
 
 --input, -i            input layout file path
 --output, -o           output svg file path
 -t                     path path to the template folder
\end{lstlisting}

Analizzando le opzioni:

\begin{itemize}
  \item --help: utile per stampare a monitor il messaggio di aiuto;
  \item -dw,-de,-dn: per non stampare, nell'ordine, messaggi d'attenzione,
  d'errore, di notifica;
  \item -c: per effettuare solo i controllo del file e non generare l'output;
  \item -i: percorso del file di input da processare (obbligatorio);
  \item -o: percorso del file di output da processare (obbligatorio solo se non
  è presente -c);
  \item -t: è il percorso ai file di template per la generazione dell'SVG, poter
  indicare dove sono questi file permette ad un utente avanzato di intervenire
  su questi file ed effettuare cambiamenti estetici alla visualizzazione del
  diagramma; se non indicato punta alla cartella ``./templates''.
\end{itemize} 

L'esecuzione del compilatore necessità anche di alcune librerie (utili alla
gestione dei template e dell'SVG); queste librerie devono essere indicate nel
classpath:

\begin{itemize}
  \item commons-collections-3.2.jar
  \item jakarta-oro-2.0.8.jar
  \item commons-lang-2.3.jar
  \item velocity-1.5.jar
  \item cUml2Svg.jar
\end{itemize}

E' anche disponibile uno script preconfezionato (da modificare in modo da
aderire alla cartella di installazione):

\begin{lstlisting}[caption={Output dell'help da linea di comando}, style={none},language=sh]
#!/bin/bash

java -cp "lib/cUml2Svg.jar:\
	lib/commons-collections-3.2.jar:\
 	lib/commons-lang-2.3.jar:\
 	lib/jakarta-oro-2.0.8.jar:\
 	lib/velocity-1.5.jar" org.cuml2svg.compiler.Compiler $@
\end{lstlisting}

Questo script in un installazione dovrebbe prendere il nome di u2sc (Uml2Svg
Compiler) che è il nome che appare nell'aiuto del visualizzabile con il
parametro ``--help''.

